home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / sun / volume1 / tooltool2.1c / part05 < prev    next >
Encoding:
Internet Message Format  |  1989-06-06  |  44.4 KB

  1. Path: uunet!husc6!rutgers!aramis.rutgers.edu!dartagnan.rutgers.edu!mcgrew
  2. From: mcgrew@dartagnan.rutgers.edu (Charles Mcgrew)
  3. Newsgroups: comp.sources.sun
  4. Subject: v01i024:  Tooltool - a suntools user interface builder, Part 05/13
  5. Message-ID: <Jun.7.00.15.04.1989.23553@dartagnan.rutgers.edu>
  6. Date: 7 Jun 89 04:15:11 GMT
  7. Organization: Rutgers Univ., New Brunswick, N.J.
  8. Lines: 1528
  9. Approved: mcgrew@aramis.rutgers.edu
  10.  
  11. Submitted-by: Chuck Musciano <chuck@trantor.harris-atd.com>
  12. Posting-number: Volume 1, Issue 24
  13. Archive-name: tooltool2.1c/part05
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then unpack
  17. # it by saving it into a file and typing "sh file".  To overwrite existing
  18. # files, type "sh file -c".  You can also feed this as standard input via
  19. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  20. # will see the following message at the end:
  21. #        "End of archive 5 (of 13)."
  22. # Contents:  expr.c func.c lex.c
  23. # Wrapped by chuck@melmac on Thu Jun  1 10:39:31 1989
  24. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  25. if test -f 'expr.c' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'expr.c'\"
  27. else
  28. echo shar: Extracting \"'expr.c'\" \(14434 characters\)
  29. sed "s/^X//" >'expr.c' <<'END_OF_FILE'
  30. X/************************************************************************/
  31. X/*    Copyright 1988 by Chuck Musciano and Harris Corporation        */
  32. X/*                                    */
  33. X/*    Permission to use, copy, modify, and distribute this software    */
  34. X/*    and its documentation for any purpose and without fee is    */
  35. X/*    hereby granted, provided that the above copyright notice    */
  36. X/*    appear in all copies and that both that copyright notice and    */
  37. X/*    this permission notice appear in supporting documentation, and    */
  38. X/*    that the name of Chuck Musciano and Harris Corporation not be    */
  39. X/*    used in advertising or publicity pertaining to distribution    */
  40. X/*    of the software without specific, written prior permission.    */
  41. X/*    Chuck Musciano and Harris Corporation make no representations    */
  42. X/*    about the suitability of this software for any purpose.  It is    */
  43. X/*    provided "as is" without express or implied warranty.        */
  44. X/*                                    */
  45. X/*    The sale of any product based wholely or in part upon the     */
  46. X/*    technology provided by tooltool is strictly forbidden without    */
  47. X/*    specific, prior written permission from Harris Corporation.    */
  48. X/*    Tooltool technology includes, but is not limited to, the source    */
  49. X/*    code, executable binary files, specification language, and    */
  50. X/*    sample specification files.                    */
  51. X/************************************************************************/
  52. X
  53. X#include    <stdio.h>
  54. X#include    <ctype.h>
  55. X#include    <math.h>
  56. X
  57. X#include    "tooltool.h"
  58. X
  59. X/************************************************************************/
  60. XPRIVATE    v_ptr    do_compare(op, l, r)
  61. X
  62. Xregister    int    op;
  63. Xregister    v_ptr    l;
  64. Xregister    v_ptr    r;
  65. X
  66. X{    register    char    *p, *q;
  67. X
  68. X    if (is_number(l) && is_number(r))
  69. X       switch (op) {
  70. X          case E_EQUAL         : return(tt_int_result(l->number == r->number));
  71. X          case E_GREATER       : return(tt_int_result(l->number > r->number));
  72. X          case E_GREATER_EQUAL : return(tt_int_result(l->number >= r->number));
  73. X          case E_LESS          : return(tt_int_result(l->number < r->number));
  74. X          case E_LESS_EQUAL    : return(tt_int_result(l->number <= r->number));
  75. X          case E_NOT_EQUAL     : return(tt_int_result(l->number != r->number));
  76. X          }
  77. X    else {
  78. X       p = tt_string_of(l);
  79. X       q = tt_string_of(r);
  80. X       switch (op) {
  81. X          case E_EQUAL         : return(tt_int_result(strcmp(p, q) == 0));
  82. X          case E_GREATER       : return(tt_int_result(strcmp(p, q) > 0));
  83. X          case E_GREATER_EQUAL : return(tt_int_result(strcmp(p, q) >= 0));
  84. X          case E_LESS          : return(tt_int_result(strcmp(p, q) < 0));
  85. X          case E_LESS_EQUAL    : return(tt_int_result(strcmp(p, q) <= 0));
  86. X          case E_NOT_EQUAL     : return(tt_int_result(strcmp(p, q) != 0));
  87. X          }
  88. X       }
  89. X}
  90. X
  91. X/************************************************************************/
  92. XPRIVATE    v_ptr    do_array_ref(a, i)
  93. X
  94. Xregister    v_ptr    a;
  95. Xregister    v_ptr    i;
  96. X
  97. X{    register    v_ptr    v;
  98. X    register    char    *s;
  99. X    register    int    cmp;
  100. X
  101. X    s = tt_string_of(i);
  102. X    if (is_array(a)) {
  103. X       for (v = a->value; v; )
  104. X          if ((cmp = tt_dict_compare(s, v->index)) == 0)
  105. X             break;
  106. X          else if (cmp < 0)
  107. X             v = v->left;
  108. X          else
  109. X             v = v->right;
  110. X       if (v)
  111. X          return(v);
  112. X       }
  113. X    else {
  114. X       a->kind = V_ARRAY;
  115. X       a->value = NULL;
  116. X       }
  117. X    v = (v_ptr) safe_malloc(sizeof(v_data));
  118. X    v->kind = V_NOTHING;
  119. X    v->number = 0.0;
  120. X    v->str = "";
  121. X    v->value = NULL;
  122. X    v->left = NULL;
  123. X    v->right = NULL;
  124. X    tt_insert_array(&(a->value), strsave(s), v);
  125. X    return(v);
  126. X}
  127. X
  128. X/************************************************************************/
  129. XPRIVATE    v_ptr    dup_array(v)
  130. X
  131. Xregister    v_ptr    v;
  132. X
  133. X{    register    v_ptr    new;
  134. X
  135. X    if (v == NULL)
  136. X       return(NULL);
  137. X    new = (v_ptr) safe_malloc(sizeof(v_data));
  138. X    new->kind = v->kind;
  139. X    new->number = v->number;
  140. X    new->left = dup_array(v->left);
  141. X    new->right = dup_array(v->right);
  142. X    new->index = strsave(v->index);
  143. X    if (is_array(new))
  144. X       new->value = dup_array(v->value);
  145. X    else
  146. X       new->str = is_number(new)? NULL : strsave(v->str);
  147. X    return(new);
  148. X}
  149. X
  150. X/************************************************************************/
  151. XPRIVATE    char    *concatenate(v, separator)
  152. X
  153. Xregister    v_ptr    v;
  154. Xchar        separator;
  155. X
  156. X{    register    char    *l, *m, *r, *p;
  157. X    char    buf[2];
  158. X
  159. X    if (v == NULL)
  160. X       return("");
  161. X    buf[0] = separator;
  162. X    buf[1] = '\0';
  163. X    l = concatenate(v->left, separator);
  164. X    m = tt_string_of(v);
  165. X    r = concatenate(v->right, separator);
  166. X    p = tt_emalloc(strlen(l) + strlen(m) + strlen(r) + 3);
  167. X    strcpy(p, l);
  168. X    if (*m) {
  169. X       if (*p)
  170. X          strcat(p, buf);
  171. X       strcat(p, m);
  172. X       }
  173. X    if (*r) {
  174. X       if (*p)
  175. X          strcat(p, buf);
  176. X       strcat(p, r);
  177. X       }
  178. X    return(p);
  179. X}
  180. X
  181. X/************************************************************************/
  182. XPRIVATE    free_array(v)
  183. X
  184. Xv_ptr    v;
  185. X
  186. X{
  187. X    if (v) {
  188. X       if (is_array(v))
  189. X          safe_free(v->value);
  190. X       safe_free(v->index);
  191. X       free_array(v->left);
  192. X       free_array(v->right);
  193. X       safe_free(v);
  194. X       }
  195. X}
  196. X
  197. X/************************************************************************/
  198. XPRIVATE    do_assign(l, r)
  199. X
  200. Xregister    v_ptr    l;
  201. Xregister    v_ptr    r;
  202. X
  203. X{
  204. X    if (is_array(l))
  205. X       free_array(l->value);
  206. X    l->kind = (r->kind & V_TYPES) | (l->kind & V_SPECIAL);
  207. X    if (is_gadget(l))
  208. X       switch (l->gadget->kind) {
  209. X          case GADGET_CHOICE :
  210. X          case GADGET_SLIDER : panel_set(l->gadget->panel_item, PANEL_VALUE, (int) r->number, 0);
  211. X                         break;
  212. X          case GADGET_TEXT   : panel_set(l->gadget->panel_item, PANEL_VALUE, tt_string_of(r), 0);
  213. X                         break;
  214. X/*          case GADGET_LABEL  : panel_set(l->gadget->panel_item, PANEL_LABEL_STRING, tt_string_of(r), 0);
  215. X                         break;*/
  216. X          default         : abend("cannot assign a value to a button or menu");
  217. X          }
  218. X    if (is_array(l))
  219. X       l->value = dup_array(r->value);
  220. X    else if (is_number(l))
  221. X       l->number = r->number;
  222. X    else {
  223. X       l->str = strsave(r->str);
  224. X       l->number = r->number;
  225. X       }
  226. X    if (is_interval(l))
  227. X       tt_set_timer((int) l->number, ((int) (l->number * 1000000.0)) % 1000000);
  228. X}
  229. X
  230. X/************************************************************************/
  231. XEXPORT    v_ptr    tt_int_result(i)
  232. X
  233. Xint    i;
  234. X
  235. X{    char    buf[20];
  236. X    register    v_ptr    v;
  237. X
  238. X    v = (v_ptr) tt_emalloc(sizeof(v_data));
  239. X    v->str = NULL;
  240. X    v->kind = V_NUMBER;
  241. X    v->number = i;
  242. X    v->left = NULL;
  243. X    v->right = NULL;
  244. X    return(v);
  245. X}
  246. X
  247. X/************************************************************************/
  248. XEXPORT    v_ptr    tt_double_result(r)
  249. X
  250. Xdouble    r;
  251. X
  252. X{    char    buf[20];
  253. X    register    v_ptr    v;
  254. X
  255. X    v = (v_ptr) tt_emalloc(sizeof(v_data));
  256. X    v->str = NULL;
  257. X    v->kind = V_NUMBER;
  258. X    v->number = r;
  259. X    v->left = NULL;
  260. X    v->right = NULL;
  261. X    return(v);
  262. X}
  263. X
  264. X/************************************************************************/
  265. XEXPORT    v_ptr    tt_string_result(s)
  266. X
  267. Xchar    *s;
  268. X
  269. X{    char    buf[20];
  270. X    double    atof();
  271. X    register    v_ptr    v;
  272. X
  273. X    v = (v_ptr) tt_emalloc(sizeof(v_data));
  274. X    if (tt_is_temp(s))
  275. X       v->str = s;
  276. X    else
  277. X       v->str = estrsave(s);
  278. X    v->kind = V_NOTHING;
  279. X    v->number = tt_is_number(s)? atof(s) : 0.0;
  280. X    v->left = NULL;
  281. X    v->right = NULL;
  282. X    return(v);
  283. X}
  284. X
  285. X/************************************************************************/
  286. XEXPORT    char    *tt_string_of(v)
  287. X
  288. Xregister    v_ptr    v;
  289. X
  290. X{    register    char    *p;
  291. X    char    buf[20], *delimiters;
  292. X
  293. X    if (is_array(v)) {
  294. X       if (is_array(tt_delimiters->value) || (delimiters = tt_string_of(tt_delimiters->value)) == NULL)
  295. X          delimiters = " ";
  296. X       return(concatenate(v->value, *delimiters));
  297. X       }
  298. X    else if (is_number(v)) {
  299. X       sprintf(buf, "%1.12g", v->number);
  300. X       return(estrsave(buf));
  301. X       }
  302. X    else
  303. X       return(v->str);
  304. X}
  305. X
  306. X/************************************************************************/
  307. XEXPORT    v_ptr    tt_insert_array(array, index, value)
  308. X
  309. Xregister    v_ptr    *array;
  310. Xregister    char    *index;
  311. Xregister    v_ptr    value;
  312. X
  313. X{    int    cmp;
  314. X
  315. X    while (*array)
  316. X       if ((cmp = tt_dict_compare(index, (*array)->index)) == 0)
  317. X          abend("%s should not exist in array", index);
  318. X       else if (cmp < 0)
  319. X          array = &((*array)->left);
  320. X       else
  321. X          array = &((*array)->right);
  322. X    *array = value;
  323. X    value->index = index;
  324. X}
  325. X
  326. X/************************************************************************/
  327. XEXPORT    e_ptr    tt_make_expr(op, arg1, arg2, arg3)
  328. X
  329. Xint    op;
  330. Xe_ptr    arg1, arg2, arg3;
  331. X
  332. X{    e_ptr    e;
  333. X
  334. X    e = (e_ptr) safe_malloc(sizeof(e_data));
  335. X    switch (e->op = op) {
  336. X       case E_QUESTION      : 
  337. X                     e->extra = arg3;
  338. X       case E_AND           :
  339. X       case E_ARRAY_REF     :
  340. X       case E_ASSIGN_AND    :
  341. X       case E_ASSIGN_DIVIDE :
  342. X       case E_ASSIGN_MINUS  :
  343. X       case E_ASSIGN_MODULO :
  344. X       case E_ASSIGN_OR     :
  345. X       case E_ASSIGN_PLUS   :
  346. X       case E_ASSIGN_TIMES  :
  347. X       case E_ASSIGN_XOR    :
  348. X       case E_ASSIGNMENT    :
  349. X       case E_COMMA         :
  350. X       case E_DIVIDE        :
  351. X       case E_EQUAL         :
  352. X       case E_GREATER       :
  353. X       case E_GREATER_EQUAL :
  354. X       case E_LEFT_SHIFT    :
  355. X       case E_LESS          :
  356. X       case E_LESS_EQUAL    :
  357. X       case E_LOGICAL_AND   :
  358. X       case E_LOGICAL_NOT   :
  359. X       case E_LOGICAL_OR    :
  360. X       case E_MINUS         :
  361. X       case E_MODULO        :
  362. X       case E_NOT_EQUAL     :
  363. X       case E_OR            :
  364. X       case E_PLUS          :
  365. X       case E_RIGHT_SHIFT   :
  366. X       case E_TIMES         :
  367. X       case E_XOR           : 
  368. X                     e->right = arg2;
  369. X       case E_COMPLEMENT    :
  370. X       case E_PAREN         :
  371. X       case E_POSTDECREMENT :
  372. X       case E_POSTINCREMENT :
  373. X       case E_PREDECREMENT  :
  374. X       case E_PREINCREMENT  :
  375. X       case E_UMINUS        :
  376. X                     e->left = arg1;
  377. X                     break;
  378. X       case E_FUNC_ID       : e->func = (f_ptr) arg1;
  379. X                     e->left = arg2;
  380. X                     break;
  381. X       case E_STRING        : e->string = (char *) arg1;
  382. X                     break;
  383. X       case E_NUMBER    : e->value = *((double *) arg1);
  384. X                     break;
  385. X       case E_SYMBOL        : e->symbol = (s_ptr) arg1;
  386. X                     break;
  387. X       }
  388. X    return(e);
  389. X}
  390. X
  391. X/************************************************************************/
  392. XEXPORT    v_ptr    tt_eval(e)
  393. X
  394. Xregister    e_ptr    e;
  395. X
  396. X{    double    r;
  397. X    int    i;
  398. X    v_ptr    v, w;
  399. X    char    *p, *q, *s;
  400. X
  401. X    if (e == NULL)
  402. X       return(NULL);
  403. X    switch (e->op) {
  404. X       case E_AND           : return(tt_int_result(((int) tt_eval(e->left)->number) & ((int) tt_eval(e->right)->number)));
  405. X       case E_ARRAY_REF     : return(do_array_ref(tt_eval(e->left), tt_eval(e->right)));
  406. X       case E_ASSIGN_AND    : v = tt_eval(e->left);
  407. X                     do_assign(v, tt_int_result(((int) v->number) & ((int) tt_eval(e->right)->number)));
  408. X                     return(v);
  409. X       case E_ASSIGN_DIVIDE : v = tt_eval(e->left);
  410. X                     if ((r = tt_eval(e->right)->number) == 0.0)
  411. X                        abend("division by zero");
  412. X                     else {
  413. X                        do_assign(v, tt_double_result(v->number / r));
  414. X                        return(v);
  415. X                        }
  416. X       case E_ASSIGN_MINUS  : v = tt_eval(e->left);
  417. X                     do_assign(v, tt_double_result(v->number - tt_eval(e->right)->number));
  418. X                     return(v);
  419. X       case E_ASSIGN_MODULO : v = tt_eval(e->left);
  420. X                     do_assign(v, tt_int_result(((int) v->number) % ((int) tt_eval(e->right)->number)));
  421. X                     return(v);
  422. X       case E_ASSIGN_OR     : v = tt_eval(e->left);
  423. X                     do_assign(v, tt_int_result(((int) v->number) | ((int) tt_eval(e->right)->number)));
  424. X                     return(v);
  425. X       case E_ASSIGN_PLUS   : v = tt_eval(e->left);
  426. X                     do_assign(v, tt_double_result(v->number + tt_eval(e->right)->number));
  427. X                     return(v);
  428. X       case E_ASSIGN_TIMES  : v = tt_eval(e->left);
  429. X                     do_assign(v, tt_double_result(v->number * tt_eval(e->right)->number));
  430. X                     return(v);
  431. X       case E_ASSIGN_XOR    : v = tt_eval(e->left);
  432. X                     do_assign(v, tt_int_result(((int) v->number) ^ ((int) tt_eval(e->right)->number)));
  433. X                     return(v);
  434. X       case E_ASSIGNMENT    : do_assign(tt_eval(e->left), v = tt_eval(e->right));
  435. X                     return(v);
  436. X       case E_COMMA         : p = tt_string_of(tt_eval(e->left));
  437. X                     q = tt_string_of(tt_eval(e->right));
  438. X                     s = tt_emalloc(strlen(p) + strlen(q) + 1);
  439. X                     strcpy(s, p);
  440. X                     strcat(s, q);
  441. X                     return(tt_string_result(s));
  442. X       case E_COMPLEMENT    : return(tt_int_result(~((int) tt_eval(e->left)->number)));
  443. X       case E_DIVIDE        : if ((r = tt_eval(e->right)->number) == 0.0)
  444. X                        abend("division by zero");
  445. X                     else
  446. X                        return(tt_double_result(tt_eval(e->left)->number / r));
  447. X       case E_EQUAL         :
  448. X       case E_GREATER       :
  449. X       case E_GREATER_EQUAL :
  450. X       case E_LESS          :
  451. X       case E_LESS_EQUAL    :
  452. X       case E_NOT_EQUAL     : return(do_compare(e->op, tt_eval(e->left), tt_eval(e->right)));
  453. X       case E_FUNC_ID       : return(e->func(e->left));
  454. X       case E_LEFT_SHIFT    : return(tt_int_result(((int) tt_eval(e->left)->number) << ((int) tt_eval(e->right)->number)));
  455. X       case E_LOGICAL_AND   : return(tt_int_result(((int) tt_eval(e->left)->number) && ((int) tt_eval(e->right)->number)));
  456. X       case E_LOGICAL_NOT   : return(tt_int_result(!((int) tt_eval(e->left)->number)));
  457. X       case E_LOGICAL_OR    : return(tt_int_result(((int) tt_eval(e->left)->number) || ((int) tt_eval(e->right)->number)));
  458. X       case E_MINUS         : return(tt_double_result(tt_eval(e->left)->number - tt_eval(e->right)->number));
  459. X       case E_MODULO        : if ((i = ((int) tt_eval(e->right)->number)) == 0)
  460. X                        abend("modulus by zero");
  461. X                     else
  462. X                        return(tt_int_result(((int) tt_eval(e->left)->number) % i));
  463. X       case E_NUMBER    : return(tt_double_result(e->value));
  464. X       case E_OR            : return(tt_int_result(((int) tt_eval(e->left)->number) | ((int) tt_eval(e->right)->number)));
  465. X       case E_PAREN         : return(tt_eval(e->left));
  466. X       case E_PLUS          : return(tt_double_result(tt_eval(e->left)->number + tt_eval(e->right)->number));
  467. X       case E_POSTDECREMENT : v = tt_eval(e->left);
  468. X                     do_assign(v, tt_double_result((r = v->number) - 1.0));
  469. X                     return(tt_double_result(r));
  470. X       case E_POSTINCREMENT : v = tt_eval(e->left);
  471. X                     do_assign(v, tt_double_result((r = v->number) + 1.0));
  472. X                     return(tt_double_result(r));
  473. X       case E_PREDECREMENT  : v = tt_eval(e->left);
  474. X                     do_assign(v, tt_double_result(v->number - 1.0));
  475. X                     return(v);
  476. X       case E_PREINCREMENT  : v = tt_eval(e->left);
  477. X                     do_assign(v, tt_double_result(v->number + 1.0));
  478. X                     return(v);
  479. X       case E_QUESTION      : return(((int) tt_eval(e->left)->number)? tt_eval(e->right) : tt_eval(e->extra));
  480. X       case E_RIGHT_SHIFT   : return(tt_int_result(((int) tt_eval(e->left)->number) >> ((int) tt_eval(e->right)->number)));
  481. X       case E_STRING        : return(tt_string_result(e->string));
  482. X       case E_SYMBOL        : return(tt_get_value(e->symbol));
  483. X       case E_TIMES         : return(tt_double_result(tt_eval(e->left)->number * tt_eval(e->right)->number));
  484. X       case E_UMINUS        : return(tt_double_result(-tt_eval(e->left)->number));
  485. X       case E_XOR           : return(tt_int_result(((int) tt_eval(e->left)->number) ^ ((int) tt_eval(e->right)->number)));
  486. X       }
  487. X}
  488. END_OF_FILE
  489. if test 14434 -ne `wc -c <'expr.c'`; then
  490.     echo shar: \"'expr.c'\" unpacked with wrong size!
  491. fi
  492. # end of 'expr.c'
  493. fi
  494. if test -f 'func.c' -a "${1}" != "-c" ; then 
  495.   echo shar: Will not clobber existing file \"'func.c'\"
  496. else
  497. echo shar: Extracting \"'func.c'\" \(13815 characters\)
  498. sed "s/^X//" >'func.c' <<'END_OF_FILE'
  499. X/************************************************************************/
  500. X/*    Copyright 1988 by Chuck Musciano and Harris Corporation        */
  501. X/*                                    */
  502. X/*    Permission to use, copy, modify, and distribute this software    */
  503. X/*    and its documentation for any purpose and without fee is    */
  504. X/*    hereby granted, provided that the above copyright notice    */
  505. X/*    appear in all copies and that both that copyright notice and    */
  506. X/*    this permission notice appear in supporting documentation, and    */
  507. X/*    that the name of Chuck Musciano and Harris Corporation not be    */
  508. X/*    used in advertising or publicity pertaining to distribution    */
  509. X/*    of the software without specific, written prior permission.    */
  510. X/*    Chuck Musciano and Harris Corporation make no representations    */
  511. X/*    about the suitability of this software for any purpose.  It is    */
  512. X/*    provided "as is" without express or implied warranty.        */
  513. X/*                                    */
  514. X/*    The sale of any product based wholely or in part upon the     */
  515. X/*    technology provided by tooltool is strictly forbidden without    */
  516. X/*    specific, prior written permission from Harris Corporation.    */
  517. X/*    Tooltool technology includes, but is not limited to, the source    */
  518. X/*    code, executable binary files, specification language, and    */
  519. X/*    sample specification files.                    */
  520. X/************************************************************************/
  521. X
  522. X#include    <stdio.h>
  523. X#include    <ctype.h>
  524. X#include    <pwd.h>
  525. X#include    <grp.h>
  526. X
  527. X#include    <sys/types.h>
  528. X#include    <sys/stat.h>
  529. X#include    <sys/file.h>
  530. X
  531. X#include    "tooltool.h"
  532. X
  533. XPUBLIC    char    *getenv(), *rindex();
  534. X
  535. XPRIVATE    v_ptr    do_cardinality(),
  536. X        do_cd(),
  537. X        do_executable(),
  538. X        do_exists(),
  539. X        do_format(),
  540. X        do_getenv(),
  541. X        do_group(),
  542. X        do_head(),
  543. X        do_index(),
  544. X        do_is_open(),
  545. X        do_length(),
  546. X        do_output_of(),
  547. X        do_pwd(),
  548. X        do_readable(),
  549. X        do_root(),
  550. X        do_selection(),
  551. X        do_stat(),
  552. X        do_substr(),
  553. X        do_suffix(),
  554. X        do_system(),
  555. X        do_tail(),
  556. X        do_tokenize(),
  557. X        do_user(),
  558. X        do_verify(),
  559. X        do_writable();
  560. X
  561. XPRIVATE    struct    {char    *name;
  562. X         f_ptr    func;
  563. X        } func[] = {{"cardinality", do_cardinality},
  564. X                {"cd",          do_cd},
  565. X                {"executable",  do_executable},
  566. X                {"exists",      do_exists},
  567. X                {"format",      do_format},
  568. X                {"getenv",      do_getenv},
  569. X                {"group",       do_group},
  570. X                {"head",        do_head},
  571. X                {"index",       do_index},
  572. X                {"is_open",     do_is_open},
  573. X                {"length",      do_length},
  574. X                {"output_of",   do_output_of},
  575. X                {"pwd",         do_pwd},
  576. X                {"readable",    do_readable},
  577. X                {"root",        do_root},
  578. X                {"selection",   do_selection},
  579. X                {"stat",        do_stat},
  580. X                {"substr",      do_substr},
  581. X                {"suffix",      do_suffix},
  582. X                {"system",      do_system},
  583. X                {"tail",        do_tail},
  584. X                {"tokenize",    do_tokenize},
  585. X                {"user",        do_user},
  586. X                {"verify",      do_verify},
  587. X                {"writable",    do_writable},
  588. X                {NULL,          NULL}};
  589. X
  590. X/************************************************************************/
  591. XEXPORT    f_ptr    tt_is_function(s)
  592. X
  593. Xchar    *s;
  594. X
  595. X{    int    i;
  596. X
  597. X    for (i = 0; func[i].name; i++)
  598. X       if (strcmp(func[i].name, s) == 0)
  599. X          return(func[i].func);
  600. X    return(NULL);
  601. X}
  602. X
  603. X/************************************************************************/
  604. XPRIVATE    char    *fix_ctime(time)
  605. X
  606. Xint    *time;
  607. X
  608. X{    char    *p;
  609. X
  610. X    p = ctime(time);
  611. X    p[24] = '\0';
  612. X    return(p);
  613. X}
  614. X
  615. X/************************************************************************/
  616. XPRIVATE    e_ptr    get_parm(e, n)
  617. X
  618. Xe_ptr    e;
  619. Xint    n;
  620. X
  621. X{    e_ptr    e1;
  622. X    int    i, depth;
  623. X
  624. X    if (e == NULL)
  625. X       return(NULL);
  626. X    for (e1 = e, depth = 1; e1->op == E_COMMA; e1 = e1->left)
  627. X       depth++;
  628. X    if (n > depth)
  629. X       return(NULL);
  630. X    else if (depth == 1)
  631. X       return(e);
  632. X    else {
  633. X       for (i = depth - n; i; i--)
  634. X          e = e->left;
  635. X       return((n == 1)? e : e->right);
  636. X       }
  637. X}
  638. X
  639. X/************************************************************************/
  640. XPRIVATE    int    child_count(v)
  641. X
  642. Xv_ptr    v;
  643. X
  644. X{
  645. X    return(v? child_count(v->left) + child_count(v->right) + 1 : 0);
  646. X}
  647. X
  648. X/************************************************************************/
  649. XPRIVATE    v_ptr    do_cardinality(e)
  650. X
  651. Xe_ptr    e;
  652. X
  653. X{    v_ptr    v;
  654. X
  655. X    v = tt_eval(e);
  656. X    if (is_array(v))
  657. X       return(tt_int_result(child_count(v->value)));
  658. X    else
  659. X       return(tt_int_result(0));
  660. X}
  661. X
  662. X/************************************************************************/
  663. XPRIVATE    v_ptr    do_cd(e)
  664. X
  665. Xe_ptr    e;
  666. X
  667. X{
  668. X    return(tt_int_result(chdir(tt_string_of(tt_eval(e)))? 0 : 1));
  669. X}
  670. X
  671. X/************************************************************************/
  672. XPRIVATE    v_ptr    do_executable(e)
  673. X
  674. Xe_ptr    e;
  675. X
  676. X{    struct    stat    buf;
  677. X    int    result;
  678. X    char    *p;
  679. X
  680. X    if (stat(p = tt_string_of(tt_eval(e)), &buf) == 0 && access(p, X_OK) == 0)
  681. X       result = 1;
  682. X    else
  683. X       result = 0;
  684. X    return(tt_int_result(result));
  685. X}
  686. X
  687. X/************************************************************************/
  688. XPRIVATE    v_ptr    do_exists(e)
  689. X
  690. Xe_ptr    e;
  691. X
  692. X{    struct    stat    buf;
  693. X
  694. X    return(tt_int_result((stat(tt_string_of(tt_eval(e)), &buf) == -1)? 0 : 1));
  695. X}
  696. X
  697. X/************************************************************************/
  698. XPRIVATE    v_ptr    do_format(e)
  699. X
  700. Xe_ptr    e;
  701. X
  702. X{    char    fmt[1024], result[1024], *p, *q, *r, *format;
  703. X    int    parm;
  704. X    e_ptr    e1;
  705. X
  706. X    format = tt_string_of(tt_eval(get_parm(e, 1)));
  707. X    for (parm = 1, q = result, p = fmt; *format; format++) {
  708. X       *p++ = *format;
  709. X       if (*format == '%') {
  710. X          for (format++; index("0123456789.-+ #", *format); )
  711. X             *p++ = *format++;
  712. X          *p++ = *format;
  713. X          *p = '\0';
  714. X          if (index("eEfgG", *format)) { /* print as a double */
  715. X             if ((e1 = get_parm(e, ++parm)) == NULL)
  716. X                abend("too few parameters supplied to 'format'");
  717. X             sprintf(q, fmt, tt_eval(e1)->number);
  718. X             }
  719. X          else if (index("cdloxXu", *format)) { /* print as integer */
  720. X             if ((e1 = get_parm(e, ++parm)) == NULL)
  721. X                abend("too few parameters supplied to 'format'");
  722. X             sprintf(q, fmt, (int) tt_eval(e1)->number);
  723. X             }
  724. X          else if (*format == 's') { /* a string */
  725. X             if ((e1 = get_parm(e, ++parm)) == NULL)
  726. X                abend("too few parameters supplied to 'format'");
  727. X             sprintf(q, fmt, tt_string_of(tt_eval(e1)));
  728. X             }
  729. X          else if (*format == '%')
  730. X             sprintf(q, fmt);
  731. X          else
  732. X             abend("invalid format character passed to 'format': %c", *format);
  733. X          q += strlen(q);
  734. X          p = fmt;
  735. X          }
  736. X       }
  737. X    *p = '\0';
  738. X    sprintf(q, fmt);
  739. X    return(tt_string_result(result));
  740. X}
  741. X
  742. X/************************************************************************/
  743. XPRIVATE    v_ptr    do_getenv(e)
  744. X
  745. Xe_ptr    e;
  746. X
  747. X{    register    char    *p;
  748. X
  749. X    p = getenv(tt_string_of(tt_eval(e)));
  750. X    return(tt_string_result(p? p : ""));
  751. X}
  752. X
  753. X/************************************************************************/
  754. XPRIVATE    v_ptr    do_group()
  755. X
  756. X{    register    struct    group    *gp;
  757. X    register    int    gid;
  758. X
  759. X    if (gp = getgrgid(gid = getgid()))
  760. X       return(tt_string_result(gp->gr_name));
  761. X    else
  762. X       return(tt_int_result(gid));
  763. X}
  764. X
  765. X/************************************************************************/
  766. XPRIVATE    v_ptr    do_head(e)
  767. X
  768. Xe_ptr    e;
  769. X
  770. X{    char    *p, *s;
  771. X
  772. X    p = tt_string_of(tt_eval(e));
  773. X    if (s = rindex(p, '/'))
  774. X       *s = '\0';
  775. X    return(tt_string_result(p));
  776. X}
  777. X
  778. X/************************************************************************/
  779. XPRIVATE    v_ptr    do_index(e)
  780. X
  781. X{    char    *source, *target;
  782. X    int    i;
  783. X
  784. X    source = tt_string_of(tt_eval(get_parm(e, 1)));
  785. X    target = tt_string_of(tt_eval(get_parm(e, 2)));
  786. X    if (source == NULL || target == NULL)
  787. X       abend("too few parameters supplied to 'index'");
  788. X    for (i = 1; *source; source++, i++) {
  789. X       for ( ; *source && *source != *target; source++, i++)
  790. X          ;
  791. X       if (strncmp(source, target, strlen(target)) == 0)
  792. X          return(tt_int_result(i));
  793. X       }
  794. X    return(tt_int_result(0));
  795. X}
  796. X
  797. X/************************************************************************/
  798. XPRIVATE    v_ptr    do_is_open()
  799. X
  800. X{
  801. X    return(tt_int_result(window_get(tt_base_window->frame, FRAME_CLOSED)? 0 : 1));
  802. X}
  803. X
  804. X/************************************************************************/
  805. XPRIVATE    v_ptr    do_length(e)
  806. X
  807. Xe_ptr    e;
  808. X
  809. X{
  810. X    return(tt_int_result(strlen(tt_string_of(tt_eval(e)))));
  811. X}
  812. X
  813. X/************************************************************************/
  814. XPRIVATE    v_ptr    do_output_of(e)
  815. X
  816. Xe_ptr    e;
  817. X
  818. X{    FILE    *f;
  819. X    char    *buf, *p;
  820. X    int    amt, size;
  821. X
  822. X    if ((f = popen(tt_string_of(tt_eval(e)), "r")) == NULL)
  823. X       return(tt_int_result(-1));
  824. X    for (buf = p = tt_emalloc(65536), size = 65536; size > 0 && (amt = fread(p, sizeof(char), 1024, f)); p += amt, size -= amt)
  825. X       ;
  826. X    *p = '\0';
  827. X    pclose(f);
  828. X    return(tt_string_result(buf));
  829. X}
  830. X
  831. X/************************************************************************/
  832. XPRIVATE    v_ptr    do_pwd()
  833. X
  834. X{    char    buf[1024];
  835. X
  836. X    getwd(buf);
  837. X    return(tt_string_result(buf));
  838. X}
  839. X
  840. X/************************************************************************/
  841. XPRIVATE    v_ptr    do_readable(e)
  842. X
  843. Xe_ptr    e;
  844. X
  845. X{    struct    stat    buf;
  846. X    int    result;
  847. X    char    *p;
  848. X
  849. X    if (stat(p = tt_string_of(tt_eval(e)), &buf) == 0 && access(p, R_OK) == 0)
  850. X       result = 1;
  851. X    else
  852. X       result = 0;
  853. X    return(tt_int_result(result));
  854. X}
  855. X
  856. X/************************************************************************/
  857. XPRIVATE    v_ptr    do_root(e)
  858. X
  859. Xe_ptr    e;
  860. X
  861. X{    char    *s, *p, *q;
  862. X
  863. X    p = tt_string_of(tt_eval(e));
  864. X    s = rindex(p, '/');
  865. X    q = rindex(p, '.');
  866. X    if (s) {
  867. X       if (q > s)
  868. X          *q = '\0';
  869. X       }
  870. X    else if (q)
  871. X       *q = '\0';
  872. X    return(tt_string_result(p));
  873. X}
  874. X
  875. X/************************************************************************/
  876. XPRIVATE    v_ptr    do_selection(e)
  877. X
  878. Xe_ptr    e;
  879. X
  880. X{
  881. X    return(tt_string_result(tt_get_selection((int) tt_eval(e)->number)));
  882. X}
  883. X
  884. X/************************************************************************/
  885. XPRIVATE    v_ptr    do_stat(e)
  886. X
  887. Xe_ptr    e;
  888. X
  889. X{    register    v_ptr    v;
  890. X    struct    stat    buf;
  891. X    register    struct    passwd    *pp;
  892. X    register    struct    group    *gp;
  893. X
  894. X    v = (v_ptr) tt_emalloc(sizeof(v_data));
  895. X    v->kind = V_ARRAY;
  896. X    v->index = NULL;
  897. X    v->value = NULL;
  898. X    v->left = NULL;
  899. X    v->right = NULL;
  900. X    if (stat(tt_string_of(tt_eval(e)), &buf) == 0) {
  901. X       tt_insert_array(&(v->value), estrsave("mode"), tt_int_result(buf.st_mode));
  902. X       if (pp = getpwuid(buf.st_uid))
  903. X          tt_insert_array(&(v->value), estrsave("uid"), tt_string_result(pp->pw_name));
  904. X       else
  905. X          tt_insert_array(&(v->value), estrsave("uid"), tt_int_result(buf.st_uid));
  906. X       if (gp = getgrgid(buf.st_gid))
  907. X          tt_insert_array(&(v->value), estrsave("gid"), tt_string_result(gp->gr_name));
  908. X       else
  909. X          tt_insert_array(&(v->value), estrsave("gid"), tt_int_result(buf.st_gid));
  910. X       tt_insert_array(&(v->value), estrsave("size"), tt_int_result(buf.st_size));
  911. X       tt_insert_array(&(v->value), estrsave("atime"), tt_string_result(fix_ctime(&(buf.st_atime))));
  912. X       tt_insert_array(&(v->value), estrsave("mtime"), tt_string_result(fix_ctime(&(buf.st_mtime))));
  913. X       tt_insert_array(&(v->value), estrsave("ctime"), tt_string_result(fix_ctime(&(buf.st_ctime))));
  914. X       }
  915. X    return(v);
  916. X}
  917. X
  918. X/************************************************************************/
  919. XPRIVATE    v_ptr    do_substr(e)
  920. X
  921. Xe_ptr    e;
  922. X
  923. X{    e_ptr    string, start, length;
  924. X    char    *s;
  925. X    int    st, l;
  926. X
  927. X    string = get_parm(e, 1);
  928. X    start = get_parm(e, 2);
  929. X    length = get_parm(e, 3);
  930. X    if (get_parm(e, 4))
  931. X       abend("too many arguments passed to 'substr'");
  932. X    s = estrsave(tt_string_of(tt_eval(string)));
  933. X    if ((st = start? tt_eval(start)->number - 1 : 0) < 0)
  934. X       abend("negative starting position passed to 'substr': %d", st);
  935. X    if ((l = length? tt_eval(length)->number : 0x7fffffff) < 0)
  936. X       abend("negative length passed to 'substr': %d", l);
  937. X    if (st > strlen(s))
  938. X       *s = '\0';
  939. X    else
  940. X       s += st;
  941. X    if (l <= strlen(s))
  942. X       *(s + l) = '\0';
  943. X    return(tt_string_result(s));
  944. X}
  945. X
  946. X/************************************************************************/
  947. XPRIVATE    v_ptr    do_suffix(e)
  948. X
  949. Xe_ptr    e;
  950. X
  951. X{    char    *s, *p, *q;
  952. X
  953. X    p = tt_string_of(tt_eval(e));
  954. X    s = rindex(p, '/');
  955. X    q = rindex(p, '.');
  956. X    if (s)
  957. X       p = (q > s)? q + 1 : "";
  958. X    else
  959. X       p = q? q + 1 : "";
  960. X    return(tt_string_result(p));
  961. X}
  962. X
  963. X/************************************************************************/
  964. XPRIVATE    v_ptr    do_system(e)
  965. X
  966. Xe_ptr    e;
  967. X
  968. X{
  969. X    return(tt_int_result(system(tt_string_of(tt_eval(e)))));
  970. X}
  971. X
  972. X/************************************************************************/
  973. XPRIVATE    v_ptr    do_tail(e)
  974. X
  975. Xe_ptr    e;
  976. X
  977. X{    char    *p, *s;
  978. X
  979. X    p = tt_string_of(tt_eval(e));
  980. X    if (s = rindex(p, '/'))
  981. X       p = s + 1;
  982. X    return(tt_string_result(p));
  983. X}
  984. X
  985. X/************************************************************************/
  986. XPRIVATE    v_ptr    do_tokenize(e)
  987. X
  988. Xe_ptr    e;
  989. X
  990. X{    register    char    **tokens, *line;
  991. X    register    int    i, max_count;
  992. X    register    v_ptr    v;
  993. X    char    buf[20];
  994. X    int    count;
  995. X
  996. X    line = tt_string_of(tt_eval(e));
  997. X    tokens = (char **) tt_emalloc((max_count = strlen(line) / 2 + 2) * sizeof(char *));
  998. X    tokenize(line, &count, tokens, max_count);
  999. X    v = (v_ptr) tt_emalloc(sizeof(v_data));
  1000. X    v->kind = V_ARRAY;
  1001. X    v->index = NULL;
  1002. X    v->value = NULL;
  1003. X    v->left = NULL;
  1004. X    v->right = NULL;
  1005. X    for (i = 0; i < count; i++) {
  1006. X       sprintf(buf, "%d", i);
  1007. X       tt_insert_array(&(v->value), estrsave(buf), tt_string_result(tokens[i]));
  1008. X       }
  1009. X    return(v);
  1010. X}
  1011. X
  1012. X/************************************************************************/
  1013. XPRIVATE    v_ptr    do_user()
  1014. X
  1015. X{    register    struct    passwd    *pp;
  1016. X    register    int    uid;
  1017. X
  1018. X    if (pp = getpwuid(uid = getuid()))
  1019. X       return(tt_string_result(pp->pw_name));
  1020. X    else
  1021. X       return(tt_int_result(uid));
  1022. X}
  1023. X
  1024. X/************************************************************************/
  1025. XPRIVATE    v_ptr    do_verify(e)
  1026. X
  1027. X{    char    *source, *valid;
  1028. X
  1029. X    source = tt_string_of(tt_eval(get_parm(e, 1)));
  1030. X    valid = tt_string_of(tt_eval(get_parm(e, 2)));
  1031. X    if (source == NULL || valid == NULL)
  1032. X       abend("too few parameters supplied to 'verify'");
  1033. X    for ( ; *source; source++)
  1034. X       if (index(valid, *source) == NULL)
  1035. X          return(tt_int_result(0));
  1036. X    return(tt_int_result(1));
  1037. X}
  1038. X
  1039. X/************************************************************************/
  1040. XPRIVATE    v_ptr    do_writable(e)
  1041. X
  1042. Xe_ptr    e;
  1043. X
  1044. X{    struct    stat    buf;
  1045. X    int    result;
  1046. X    char    *p;
  1047. X
  1048. X    if (stat(p = tt_string_of(tt_eval(e)), &buf) == 0 && access(p, W_OK) == 0)
  1049. X       result = 1;
  1050. X    else
  1051. X       result = 0;
  1052. X    return(tt_int_result(result));
  1053. X}
  1054. END_OF_FILE
  1055. if test 13815 -ne `wc -c <'func.c'`; then
  1056.     echo shar: \"'func.c'\" unpacked with wrong size!
  1057. fi
  1058. # end of 'func.c'
  1059. fi
  1060. if test -f 'lex.c' -a "${1}" != "-c" ; then 
  1061.   echo shar: Will not clobber existing file \"'lex.c'\"
  1062. else
  1063. echo shar: Extracting \"'lex.c'\" \(13060 characters\)
  1064. sed "s/^X//" >'lex.c' <<'END_OF_FILE'
  1065. X/************************************************************************/
  1066. X/*    Copyright 1988 by Chuck Musciano and Harris Corporation        */
  1067. X/*                                    */
  1068. X/*    Permission to use, copy, modify, and distribute this software    */
  1069. X/*    and its documentation for any purpose and without fee is    */
  1070. X/*    hereby granted, provided that the above copyright notice    */
  1071. X/*    appear in all copies and that both that copyright notice and    */
  1072. X/*    this permission notice appear in supporting documentation, and    */
  1073. X/*    that the name of Chuck Musciano and Harris Corporation not be    */
  1074. X/*    used in advertising or publicity pertaining to distribution    */
  1075. X/*    of the software without specific, written prior permission.    */
  1076. X/*    Chuck Musciano and Harris Corporation make no representations    */
  1077. X/*    about the suitability of this software for any purpose.  It is    */
  1078. X/*    provided "as is" without express or implied warranty.        */
  1079. X/*                                    */
  1080. X/*    The sale of any product based wholely or in part upon the     */
  1081. X/*    technology provided by tooltool is strictly forbidden without    */
  1082. X/*    specific, prior written permission from Harris Corporation.    */
  1083. X/*    Tooltool technology includes, but is not limited to, the source    */
  1084. X/*    code, executable binary files, specification language, and    */
  1085. X/*    sample specification files.                    */
  1086. X/************************************************************************/
  1087. X
  1088. X#define        RETURN(x)        return(last_token = (x))
  1089. X
  1090. X#define        FIRST_KEYWORD        ACTION
  1091. X#define        LAST_KEYWORD        WIDTH
  1092. X#define        NUM_KEYWORDS        (LAST_KEYWORD - FIRST_KEYWORD + 1)
  1093. X
  1094. X#define        CPP            "/lib/cpp"
  1095. X
  1096. XPRIVATE    FILE    *f;
  1097. XPRIVATE    int    last_token = -1;
  1098. XPRIVATE    char    buf[1024];
  1099. X
  1100. XPRIVATE    struct    {char    *name;
  1101. X         int    value;
  1102. X        } token[] = {{"action",        ACTION},
  1103. X                 {"align",        ALIGN},
  1104. X                 {"application",    APPLICATION},
  1105. X                 {"at",        AT},
  1106. X                 {"base",        BASE},
  1107. X                 {"beep",        BEEP},
  1108. X                 {"bottom",        BOTTOM},
  1109. X                 {"break",        BREAK},
  1110. X                 {"button",        BUTTON},
  1111. X                 {"by",        BY},
  1112. X                 {"center",        CENTER},
  1113. X                 {"characters",    CHARACTERS},
  1114. X                 {"choice",        CHOICE},
  1115. X                 {"close",        CLOSE},
  1116. X                 {"completion",    COMPLETION},
  1117. X                 {"continue",    CONTINUE},
  1118. X                 {"control",    CONTROL},
  1119. X                 {"current",    CURRENT},
  1120. X                 {"cycle",        CYCLE},
  1121. X                 {"dialog",        DIALOG},
  1122. X                 {"disable",    DISABLE},
  1123. X                 {"display",    DISPLAY},
  1124. X                 {"else",        ELSE},
  1125. X                 {"end_button",    END_BUTTON},
  1126. X                 {"end_choice",    END_CHOICE},
  1127. X                 {"end_dialog",    END_DIALOG},
  1128. X                 {"end_gadgets",    END_GADGETS},
  1129. X                 {"end_key",    END_KEY},
  1130. X                 {"end_keys",    END_KEYS},
  1131. X                 {"end_label",    END_LABEL},
  1132. X                 {"end_menu",    END_MENU},
  1133. X                 {"end_mouse",    END_MOUSE},
  1134. X                 {"end_slider",    END_SLIDER},
  1135. X                 {"end_text",    END_TEXT},
  1136. X                 {"exit",        EXIT},
  1137. X                 {"font",        FONT},
  1138. X                 {"for",        FOR},
  1139. X                 {"function_keys",    FUNCTION_KEYS},
  1140. X                 {"gadgets",    GADGETS},
  1141. X                 {"horizontal",    HORIZONTAL},
  1142. X                 {"icon",        ICON},
  1143. X                 {"if",        IF},
  1144. X                 {"ignore",        IGNORE},
  1145. X                 {"initial",    INITIAL},
  1146. X                 {"initialize",    INITIALIZE},
  1147. X                 {"key",        KEY},
  1148. X                 {"keys",        KEYS},
  1149. X                 {"label",        LABEL},
  1150. X                 {"left",        LEFT},
  1151. X                 {"mark",        MARK},
  1152. X                 {"maximum",    MAXIMUM},
  1153. X                 {"menu",        MENU},
  1154. X                 {"meta",        META},
  1155. X                 {"middle",        MIDDLE},
  1156. X                 {"minimum",    MINIMUM},
  1157. X                 {"mouse",        MOUSE},
  1158. X                 {"nomark",        NOMARK},
  1159. X                 {"normal",        NORMAL},
  1160. X                 {"normal_keys",    NORMAL_KEYS},
  1161. X                 {"nothing",    NOTHING},
  1162. X                 {"off",        OFF},
  1163. X                 {"on",        ON},
  1164. X                 {"open",        OPEN},
  1165. X                 {"pixels",        PIXELS},
  1166. X                 {"popup",        POPUP},
  1167. X                 {"proportional",    PROPORTIONAL},
  1168. X                 {"ragged",        RAGGED},
  1169. X                 {"range",        RANGE},
  1170. X                 {"remove",        REMOVE},
  1171. X                 {"retain",        RETAIN},
  1172. X                 {"right",        RIGHT},
  1173. X                 {"send",        SEND},
  1174. X                 {"shift",        SHIFT},
  1175. X                 {"size",        SIZE},
  1176. X                 {"slider",        SLIDER},
  1177. X                 {"text",        TEXT},
  1178. X                 {"timer",        TIMER},
  1179. X                 {"top",        TOP},
  1180. X                 {"trigger",    TRIGGER},
  1181. X                 {"ttymenu",    TTYMENU},
  1182. X                 {"value",        VALUE},
  1183. X                 {"vertical",    VERTICAL},
  1184. X                 {"while",        WHILE},
  1185. X                 {"width",        WIDTH}};
  1186. X
  1187. XPRIVATE    struct    {char    first;
  1188. X         char    next;
  1189. X         int    name;
  1190. X        } punc[] = {{'&',  '\0', LOGICAL_AND},
  1191. X                {'&',  '&',  AND},
  1192. X                {'&',  '=',  ASSIGN_AND},
  1193. X                {':',  '\0', COLON},
  1194. X                {',',  '\0', COMMA},
  1195. X                {'~',  '\0', COMPLEMENT},
  1196. X                {'=',  '\0', ASSIGNMENT},
  1197. X                {'=',  '=',  EQUAL},
  1198. X                {'>',  '\0', GREATER},
  1199. X                {'>',  '=',  GREATER_EQUAL},
  1200. X                {'>',  '>',  RIGHT_SHIFT},
  1201. X                {'{',  '\0', LBRACE},
  1202. X                {'[',  '\0', LBRACK},
  1203. X                {'<',  '\0', LESS},
  1204. X                {'<',  '=',  LESS_EQUAL},
  1205. X                {'<',  '<',  LEFT_SHIFT},
  1206. X                {'!',  '\0', LOGICAL_NOT},
  1207. X                {'!',  '=',  NOT_EQUAL},
  1208. X                {'|',  '\0', OR},
  1209. X                {'|',  '|',  LOGICAL_OR},
  1210. X                {'|',  '=',  ASSIGN_OR},
  1211. X                {'(',  '\0', LPAREN},
  1212. X                {'-',  '\0', MINUS},
  1213. X                {'-',  '-',  DECREMENT},
  1214. X                {'-',  '=',  ASSIGN_MINUS},
  1215. X                {'%',  '\0', MODULO},
  1216. X                {'%',  '=',  ASSIGN_MODULO},
  1217. X                {'+',  '\0', PLUS},
  1218. X                {'+',  '+',  INCREMENT},
  1219. X                {'+',  '=',  ASSIGN_PLUS},
  1220. X                {'?',  '\0', QUESTION},
  1221. X                {'}',  '\0', RBRACE},
  1222. X                {']',  '\0', RBRACK},
  1223. X                {')',  '\0', RPAREN},
  1224. X                {';',  '\0', SEMICOLON},
  1225. X                {'*',  '\0', TIMES},
  1226. X                {'*',  '=',  ASSIGN_TIMES},
  1227. X                {'^',  '\0', XOR},
  1228. X                {'^',  '=',  ASSIGN_XOR},
  1229. X                {'\0', '\0', -1}};
  1230. X
  1231. XPRIVATE    char    getch()
  1232. X
  1233. X{    register    char    c;
  1234. X    static        int    first = TRUE;
  1235. X
  1236. X    if (first) {
  1237. X       first = FALSE;
  1238. X       if ((f = popen(CPP, "r")) == NULL)
  1239. X          abend("could not invoke %s", CPP);
  1240. X       }
  1241. X    if (ungetc != -1)
  1242. X       c = ungetc, ungetc = -1;
  1243. X    else {
  1244. X       c = getc(f);
  1245. X       if (c == '\n')
  1246. X          line_count++;
  1247. X       }
  1248. X    return(c);
  1249. X}
  1250. X
  1251. XPRIVATE    fix_escapes(buf)
  1252. X
  1253. Xchar    *buf;
  1254. X
  1255. X{    char    *q;
  1256. X    int    i;
  1257. X
  1258. X    for (q = buf; *buf; buf++, q++)
  1259. X       if (*buf == '\\')
  1260. X          switch (*++buf) {
  1261. X             case 'b' : *q = '\010'; /* ^h */
  1262. X                        break;
  1263. X             case 'e' : *q = '\033'; /* esc */
  1264. X                      break;
  1265. X             case 'f' : *q = '\014'; /* ^l */
  1266. X                        break;
  1267. X             case 'n' : *q = '\012'; /* ^j */
  1268. X                        break;
  1269. X             case 'r' : *q = '\015'; /* ^m */
  1270. X                        break;
  1271. X             case 't' : *q = '\011'; /* ^i */
  1272. X                        break;
  1273. X             case '0' : 
  1274. X             case '1' : 
  1275. X             case '2' : 
  1276. X             case '3' : 
  1277. X             case '4' : 
  1278. X             case '5' : 
  1279. X             case '6' : 
  1280. X             case '7' : *q = *buf++ - '0';
  1281. X                        for (i = 0; i < 2 && *buf >= '0' && *buf <= '7'; i++)
  1282. X                           *q = (*q << 3) + *buf++ - '0';
  1283. X                        buf--;
  1284. X                        break;
  1285. X             default  : *q = *buf;
  1286. X                        break;
  1287. X             }
  1288. X       else if (*buf == '^' && *(buf + 1) >= '@' && *(buf + 1) <= '_')
  1289. X          *q = *++buf & 0x1f;
  1290. X       else
  1291. X          *q = *buf;
  1292. X    *q = '\0';
  1293. X}
  1294. X
  1295. XPRIVATE    int    is_keyword(s)
  1296. X
  1297. Xchar    *s;
  1298. X
  1299. X{    register    int    cmp, high, low, pos;
  1300. X
  1301. X    for (low = 0, high = NUM_KEYWORDS - 1; low <= high; )
  1302. X       if ((cmp = strcmp(s, token[pos = (high - low) / 2 + low].name)) == 0)
  1303. X          return(token[pos].value);
  1304. X       else if (cmp < 0)
  1305. X          high = pos - 1;
  1306. X       else
  1307. X          low = pos + 1;
  1308. X    return(NULL);
  1309. X}
  1310. X
  1311. XPRIVATE    int    yylex()
  1312. X
  1313. X{    register    char    c, c1, *p;
  1314. X    register    int    i, j, val;
  1315. X    char            *index();
  1316. X    double            atof();
  1317. X
  1318. X    c = getch();
  1319. X    while (isspace(c))
  1320. X       c = getch();
  1321. X    if (isalpha(c)) {
  1322. X       p = buf;
  1323. X       *p++ = c;
  1324. X       while (isalnum(c = getch()) || c == '_')
  1325. X          *p++ = c;
  1326. X       ungetc = c;
  1327. X       *p = '\0';
  1328. X       for (p = buf; *p; p++)
  1329. X          if (isupper(*p))
  1330. X             *p = tolower(*p);
  1331. X       if (i = is_keyword(buf))
  1332. X          RETURN(i);
  1333. X       if ((i = strlen(buf)) == 2) { /* possible two character function key name */
  1334. X          if (buf[0] == 'l' && buf[1] >= '2' && buf[1] <= '9') /* l2 - l9 */
  1335. X             RETURN(yylval.ival = L2 + buf[1] - '2');
  1336. X          else if (buf[0] == 'f' && buf[1] >= '1' && buf[1] <= '9') /* f1 - f9 */
  1337. X             RETURN(yylval.ival = F1 + buf[1] - '1');
  1338. X          else if (buf[0] == 'r' && buf[1] >= '1' && buf[1] <= '9') /* r1 - r9 */
  1339. X             RETURN(yylval.ival = R1 + buf[1] - '1');
  1340. X          }
  1341. X       else if (i == 3) { /* possible three character function key name */
  1342. X          if (buf[0] == 'l' && buf[1] == '1' && buf[2] == '0')
  1343. X             RETURN(yylval.ival = L10);
  1344. X          else if (buf[0] == 'r' && buf[1] == '1' && buf[2] >= '0' && buf[2] <= '5') /* r10 - r15 */
  1345. X             RETURN(yylval.ival = R10 + buf[2] - '0');
  1346. X          }
  1347. X       fix_escapes(buf);
  1348. X       yylval.cpval = strsave(buf);
  1349. X       RETURN(ID);
  1350. X       }
  1351. X    else if (c == '"') {
  1352. X       for (p = buf; TRUE; p++)
  1353. X          if ((*p = getch()) == '"')
  1354. X             break;
  1355. X          else if (*p == '\\')
  1356. X             *++p = getch();
  1357. X          else if (*p == '\n' || *p == '\r') {
  1358. X             yyerror("Newline in string not allowed");
  1359. X             break;
  1360. X             }
  1361. X       *p = '\0';
  1362. X       fix_escapes(buf);
  1363. X       yylval.cpval = strsave(buf);
  1364. X       RETURN(STRING);
  1365. X       }
  1366. X    else if (c == '\'') {
  1367. X       p = buf;
  1368. X       for (p = buf; TRUE; p++)
  1369. X          if ((*p = getch()) == '\'')
  1370. X             break;
  1371. X          else if (*p == '\\')
  1372. X             *++p = getch();
  1373. X          else if (*p == '\n' || *p == '\r') {
  1374. X             yyerror("Newline in string not allowed");
  1375. X             break;
  1376. X             }
  1377. X       *p = '\0';
  1378. X       fix_escapes(buf);
  1379. X       yylval.cpval = strsave(buf);
  1380. X       RETURN(ICON_STRING);
  1381. X       }
  1382. X    else if (isdigit(c)) {
  1383. X       if (c == '0') {
  1384. X          if ((c = getch()) == 'x') /* hex number */
  1385. X             for (val = 0; isxdigit(c = getch()); )
  1386. X                if (isdigit(c))
  1387. X                   val = val * 16 + c - '0';
  1388. X                else
  1389. X                   val = val * 16 + c - (isupper(c)? 'A' : 'a');
  1390. X          else if (isdigit(c)) /* octal */
  1391. X             for (val = c - '0'; (c = getch()) >= '0' && c <= '7'; )
  1392. X                val = val * 8 + c - '0';
  1393. X          else if (c == '.') {
  1394. X             ungetc = c;
  1395. X             c = '0';
  1396. X             goto do_real; /* with God as my witness, I'll never do this again, I swear */
  1397. X             }
  1398. X          else
  1399. X             val = 0;
  1400. X          ungetc = c;
  1401. X          yylval.ival = val;
  1402. X          RETURN(INTEGER);
  1403. X          }
  1404. X       else {
  1405. Xdo_real:      p = buf;
  1406. X          *p++ = c;
  1407. X          val = INTEGER;
  1408. X          while (isdigit(c = getch()))
  1409. X             *p++ = c;
  1410. X          if (c == '.')
  1411. X             for (*p++ = c, val = REAL; isdigit(c = getch()); )
  1412. X                *p++ = c;
  1413. X          if (c == 'e' || c == 'E') {
  1414. X             *p++ = c;
  1415. X             if ((c = getch()) == '-' || c == '+')
  1416. X                *p++ = c;
  1417. X             else
  1418. X                ungetc = c;
  1419. X             for (val = REAL; isdigit(c = getch()); )
  1420. X                *p++ = c;
  1421. X             }
  1422. X          *p = '\0';
  1423. X          ungetc = c;
  1424. X          if (val == INTEGER)
  1425. X             yylval.ival = atoi(buf);
  1426. X          else
  1427. X             yylval.rval = atof(buf);
  1428. X          RETURN(val);
  1429. X          }
  1430. X       }
  1431. X    else if (c == '/') {
  1432. X       if ((c = getch()) == '*') {
  1433. X          while (1) {
  1434. X             while ((c = getch()) != '*')
  1435. X                ;
  1436. X             if ((c = getch()) == '/')
  1437. X                break;
  1438. X             }
  1439. X          }
  1440. X       else if (c == '=')
  1441. X          RETURN(ASSIGN_DIVIDE);
  1442. X       else {
  1443. X          ungetc = c;
  1444. X          RETURN(DIVIDE);
  1445. X          }
  1446. X       }
  1447. X    else if (c == '#') {
  1448. X       if (yylex() == INTEGER) {
  1449. X          line_count = yylval.ival - 1; /* getch will bump by 1 when \n is read */
  1450. X          if (yylex() == STRING) {
  1451. X             if (*yylval.cpval)
  1452. X                tt_curr_file = yylval.cpval;
  1453. X             while (getch() != '\n')
  1454. X                ;
  1455. X             RETURN(yylex());
  1456. X             }
  1457. X          }
  1458. X       yyerror("Invalid cpp control sequence in source file");
  1459. X       }
  1460. X    else if (c == EOF) {
  1461. X       pclose(f);
  1462. X       RETURN(EOF);
  1463. X       }
  1464. X    else {
  1465. X       for (i = 0; punc[i].first; i++)
  1466. X          if (c == punc[i].first) {
  1467. X             for (c1 = getch(), j = 1; punc[i + j].first == c; j++)
  1468. X                if (c1 == punc[i + j].next)
  1469. X                   RETURN(punc[i + j].name);
  1470. X             ungetc = c1;
  1471. X             RETURN(punc[i].name);
  1472. X             }
  1473. X       yyerror("Invalid character in source file: %c (0x%02x)", c, c);
  1474. X       }
  1475. X    RETURN(yylex());
  1476. X}
  1477. X
  1478. X/************************************************************************/
  1479. XPRIVATE    print_last_token()
  1480. X
  1481. X{    int    i;
  1482. X
  1483. X    fprintf(stderr, " at or near \"");
  1484. X    if (last_token == INTEGER || last_token == REAL || last_token == STRING || last_token == ICON_STRING || last_token == ID)
  1485. X       fprintf(stderr, buf);
  1486. X    else if (last_token >= L2 && last_token <= L10)
  1487. X       fprintf(stderr, "L%d", last_token - L2 + 2);
  1488. X    else if (last_token >= F1 && last_token <= F9)
  1489. X       fprintf(stderr, "F%d", last_token - F1 + 1);
  1490. X    else if (last_token >= R1 && last_token <= R15)
  1491. X       fprintf(stderr, "R%d", last_token - R1 + 1);
  1492. X    else if (last_token >= AND && last_token <= XOR) {
  1493. X       for (i = 0; punc[i].first; i++)
  1494. X          if (punc[i].name == last_token) {
  1495. X             fprintf(stderr, "%c", punc[i].first);
  1496. X             if (punc[i].next)
  1497. X                fprintf(stderr, "%c", punc[i].next);
  1498. X             break;
  1499. X             }
  1500. X       if (punc[i].first == '\0')
  1501. X          fprintf(stderr, "!!Geez!  Some punctuation, I don't know!!");
  1502. X       }
  1503. X    else if (last_token >= FIRST_KEYWORD && last_token <= LAST_KEYWORD)
  1504. X       fprintf(stderr, token[last_token - FIRST_KEYWORD].name);
  1505. X    else if (last_token == EOF)
  1506. X       fprintf(stderr, "End Of File");
  1507. X    else
  1508. X       fprintf(stderr, "!!Geez!  Some keyword, I don't know!!");
  1509. X    fprintf(stderr, "\"");
  1510. X}
  1511. END_OF_FILE
  1512. if test 13060 -ne `wc -c <'lex.c'`; then
  1513.     echo shar: \"'lex.c'\" unpacked with wrong size!
  1514. fi
  1515. # end of 'lex.c'
  1516. fi
  1517. echo shar: End of archive 5 \(of 13\).
  1518. cp /dev/null ark5isdone
  1519. MISSING=""
  1520. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 ; do
  1521.     if test ! -f ark${I}isdone ; then
  1522.     MISSING="${MISSING} ${I}"
  1523.     fi
  1524. done
  1525. if test "${MISSING}" = "" ; then
  1526.     echo You have unpacked all 13 archives.
  1527.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1528. else
  1529.     echo You still need to unpack the following archives:
  1530.     echo "        " ${MISSING}
  1531. fi
  1532. ##  End of shell archive.
  1533. exit 0
  1534.  
  1535. Chuck Musciano            ARPA  : chuck@trantor.harris-atd.com
  1536. Harris Corporation         Usenet: ...!uunet!x102a!trantor!chuck
  1537. PO Box 37, MS 3A/1912        AT&T  : (407) 727-6131
  1538. Melbourne, FL 32902        FAX   : (407) 727-{5118,5227,4004}
  1539.